home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 4 / Apprentice-Release4.iso / Languages / PowerMacOberon 1.2 / Source / Tools / Count.Mod (.txt) < prev    next >
Oberon Text  |  1995-08-22  |  3KB  |  88 lines

  1. Syntax10.Scn.Fnt
  2. FoldElems
  3. Syntax10.Scn.Fnt
  4. (*-----------------------------------------------------
  5. Counts lines, statements and characters in an Oberon-2 module
  6. Count.Lines            (^ | * | filename {filename})
  7. Count.Statements    (^ | * | filename {filename})
  8. Count.Chars            (^ | * | filename {filename})
  9. -----------------------------------------------------*)
  10. Syntax10i.Scn.Fnt
  11. Syntax10b.Scn.Fnt
  12. Documentation
  13. MODULE Count;
  14. IMPORT Oberon, Texts, TextFrames, Viewers, Out;
  15. PROCEDURE Open(VAR t: Texts.Text; VAR s: Texts.Scanner);
  16.     VAR v: Viewers.Viewer; beg, end, time: LONGINT;
  17. BEGIN
  18.     Texts.OpenScanner(s, Oberon.Par.text, Oberon.Par.pos); Texts.Scan(s);
  19.     IF (s.class = Texts.Char) & (s.c = "^") THEN
  20.         Oberon.GetSelection(t, beg, end, time);
  21.         IF time >= 0 THEN
  22.             Texts.OpenScanner(s, t, beg); Texts.Scan(s)
  23.         END
  24.     END;
  25.     IF (s.class = Texts.Char) & (s.c = "*") THEN
  26.         v := Viewers.This(Oberon.Pointer.X, Oberon.Pointer.Y);
  27.         t := v.dsc.next(TextFrames.Frame).text
  28.     ELSE t := NIL
  29. END Open;
  30. PROCEDURE L(t: Texts.Text): LONGINT;
  31.     VAR r: Texts.Reader; ch: CHAR; lines: LONGINT;
  32. BEGIN
  33.     Texts.OpenReader(r, t, 0); Texts.Read(r, ch); lines := 0;
  34.     WHILE ch # 0X DO
  35.         IF ch = 0DX THEN INC(lines) END;
  36.         Texts.Read(r, ch)
  37.     END;
  38.     RETURN lines
  39. END L;
  40. PROCEDURE Chars*;
  41.     VAR s: Texts.Scanner; chars: LONGINT; t: Texts.Text;
  42. BEGIN
  43.     Open(t, s);
  44.     IF t # NIL THEN
  45.         Out.F("# chars$", t.len)
  46.     ELSE
  47.         WHILE s.class = Texts.Name DO
  48.             NEW(t); Texts.Open(t, s.s);
  49.             Out.String(s.s); Out.F("  # chars$", t.len);
  50.             Texts.Scan(s)
  51.         END
  52. END Chars;
  53. PROCEDURE Lines*;
  54.     VAR s: Texts.Scanner; t: Texts.Text;
  55. BEGIN
  56.     Open(t, s);
  57.     IF t # NIL THEN
  58.         Out.F("# lines$", L(t))
  59.     ELSE
  60.         WHILE s.class = Texts.Name DO
  61.             NEW(t); Texts.Open(t, s.s);
  62.             Out.String(s.s); Out.F(" lines$", L(t));
  63.             Texts.Scan(s)
  64.         END
  65. END Lines;
  66. PROCEDURE Statements*;
  67.     VAR t: Texts.Text; s: Texts.Scanner; n: INTEGER; count, empty: BOOLEAN;
  68. BEGIN
  69.     Open(t, s);
  70.     IF t = NIL THEN NEW(t); Texts.Open(t, s.s) END;
  71.     Texts.OpenScanner(s, t, 0); Texts.Scan(s); n := 0; count := FALSE;
  72.     WHILE ~ s.eot DO
  73.         IF (s.class = Texts.Char) & (s.c = ";") & count THEN
  74.             INC(n); empty := FALSE; Texts.Scan(s);
  75.             IF (s.class = Texts.Name) & (s.s = "END") THEN DEC(n) END
  76.         ELSIF (s.class = Texts.Name) & (s.s = "BEGIN") THEN
  77.             count := TRUE; empty := TRUE; Texts.Scan(s)
  78.         ELSIF (s.class = Texts.Name) & (s.s = "END") THEN
  79.             IF count & ~empty THEN INC(n) END;
  80.             empty := FALSE; Texts.Scan(s);
  81.             IF (s.class = Texts.Name) & (s.s # "END") THEN count := FALSE END
  82.         ELSE empty := FALSE; Texts.Scan(s)
  83.         END
  84.     END;
  85.     Out.F("# statements$", n)
  86. END Statements;
  87. END Count.
  88.